import { ref } from "vue"
import store from "@/store"
import { defineStore } from "pinia"
import { type RouteRecordRaw } from "vue-router"
import { flatMultiLevelRoutes } from "@/router/helper"
import routeSettings from "@/config/route"
import { constantRoutes } from "@/router/index"

// 定义一个函数hasPermission，用于判断用户是否有权限访问某个路由
const hasPermission = (roles: string[], route: RouteRecordRaw) => {
  // 获取路由的meta属性中的roles
  const routeRoles = route.meta?.roles
  // 如果路由有roles属性，则判断用户角色是否在路由的roles中
  return routeRoles ? roles.some((role) => routeRoles.includes(role)) : true
}

// 根据角色过滤动态路由
const filterDynamicRoutes = (routes: RouteRecordRaw[], roles: string[]) => {
  // 定义一个空数组，用于存储过滤后的路由
  const res: RouteRecordRaw[] = []
  // 遍历传入的路由数组
  routes.forEach((route) => {
    // 将当前路由深拷贝一份
    const tempRoute = { ...route }
    // 判断当前路由是否有权限访问
    if (hasPermission(roles, tempRoute)) {
      // 如果当前路由有子路由，则递归调用filterDynamicRoutes函数，过滤子路由
      if (tempRoute.children) {
        tempRoute.children = filterDynamicRoutes(tempRoute.children, roles)
      }
      // 将过滤后的路由添加到res数组中
      res.push(tempRoute)
    }
  })
  // 返回过滤后的路由数组
  return res
}

// 导出一个名为usePermissionStore的常量，该常量是一个函数，用于定义一个名为permission的store
export const usePermissionStore = defineStore("permission", () => {
  /** 可访问的路由 */
  const routes = ref<RouteRecordRaw[]>(constantRoutes)
  /** 有访问权限的动态路由 */
  const addRoutes = ref<RouteRecordRaw[]>([])

  /** 根据角色生成可访问的 Routes（可访问的路由 = 常驻路由 + 有访问权限的动态路由） */
  const setRoutes = (roles: string[]) => {
    const accessedRoutes = filterDynamicRoutes([], roles)
    _set(accessedRoutes)
  }

  /** 所有路由 = 所有常驻路由 + 所有动态路由 */
  const setAllRoutes = () => {}

  const _set = (accessedRoutes: RouteRecordRaw[]) => {
    addRoutes.value = routeSettings.thirdLevelRouteCache ? flatMultiLevelRoutes(accessedRoutes) : accessedRoutes
  }

  return { routes, addRoutes, setRoutes, setAllRoutes }
})

/** 在 setup 外使用 */
export function usePermissionStoreHook() {
  return usePermissionStore(store)
}
